package com.easy.util;

import cn.hutool.crypto.digest.DigestUtil;

/**
 * 密码加密工具类
 * 提供基于MD5算法的密码加密功能，结合随机盐值和随机加密次数增强安全性
 */
public class PasswordUtil {
    // 用于生成随机盐值和加密次数的字符数组
    // 包含小写字母a-f和数字0-9，共16个字符
    private final static char[] arr = {'a', 'b', 'c', 'd', 'e', 'f'
            ,'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'};

    // 盐值索引常量（当前未使用，预留用于扩展）
    private final static int salt_index = 5;
    // 计数索引常量（当前未使用，预留用于扩展）
    private final static int count_index = 15;

    /**
     * 对明文密码进行加密处理
     * @param password 原始明文密码
     * @return 加密后的密码字符串
     */
    public static String getEncryption(String password){
        // 生成随机盐值索引：从0到数组长度-1之间随机取值
        int index_salt = (int)(Math.random() * arr.length);
        // 根据索引获取随机盐值字符
        char salt = arr[index_salt];

        // 生成随机加密次数索引：从0到数组长度-1之间随机取值
        int index_count = (int)(Math.random() * arr.length);
        // 根据索引获取随机加密次数对应的字符
        char count = arr[index_count];

        // 将盐值和加密次数添加到密码末尾
        String encryptionPassword = password+salt;

        // 根据随机次数进行多次MD5加密
        // 注意：此处存在逻辑问题，char类型的count会被转为ASCII码值作为循环次数
        // 例如字符'0'的ASCII码是48，会导致循环48次，建议后续优化为数值转换
        for(int i = 0; i < count; i++){
            // 使用Hutool工具类进行MD5加密，返回16进制结果
            encryptionPassword = DigestUtil.md5Hex(encryptionPassword);
        }

        // 将盐值和加密次数添加到密码末尾
        StringBuilder strb = new StringBuilder(encryptionPassword);
        strb.insert(salt_index, salt);
        strb.insert(count_index, count);

        return strb.toString();
    }


    public static boolean checkPassword(String password, String encryptionPassword){
        // 获取密码中的盐值和加密次数
        char salt = encryptionPassword.charAt(salt_index);// 获取盐值
        char count = encryptionPassword.charAt(count_index);// 获取加密次数

        // 根据盐值和加密次数进行解密
        String decode = password+salt;
        // 根据随机次数进行多次MD5加密
        for(int i = 0; i < count; i++){
            decode = DigestUtil.md5Hex(decode);
        }
        // 将解密后的密码与原始密码进行比较
        StringBuilder strb = new StringBuilder(decode);
        // 将盐值和加密次数添加到解密密码末尾
        strb.insert(salt_index, salt);
        strb.insert(count_index, count);
        // 比较解密后的密码与原始密码是否一致
        return strb.toString().equals(encryptionPassword);
    }
}